package Z.dailyExercise.holiday;

import java.util.Arrays;

public class _628_三个数的最大乘积 {

    /**
     * 排序题
     * 自解：问题转化为寻找最大的三个正整数
     * ---可能存在一正两负的组合形式
     * 如果最后一个数是正数 那么最后一位必定取到 那就比较前两位 和倒数2 3位✖️的大小
     * 如果最后一位为0 呢么直接返回0
     * 如果为负数 那么返回倒数三位的大小
     * @param nums
     * @return
     */
    public int maximumProduct(int[] nums) {

        Arrays.sort(nums);

        if (nums[nums.length-1]>0){

            int front =nums[0]*nums[1];
            int last = nums[nums.length-2]*nums[nums.length-3];
            int max = front>=last?front:last;

            return max*nums[nums.length-1];

        }else if (nums[nums.length-1]<0){

            return nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3];
        }else {
            return 0;
        }



    }

    /**
     * 题解：自解中 本质上就是比较前三个最大的 和 前两个小的*最大的  这两个数值的大小
     * 所以不用排序 用线性扫描就行 找出前三个最大和前两个最小即可
     */
    public int maximumProduct1(int[] nums) {
        int max1 = Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
        int min1 = Integer.MAX_VALUE,min2 = Integer.MAX_VALUE;

        for (int num:nums){
            if (num>max1){
                max3 = max2;
                max2 = max1;
                max1 = num;

            }else if (num>max2){
                max3 = max2;
                max2 = num;
            }else if (num>max3){
                max3 = num;
            }

            if (num<min1){
                min2 = min1;
                min1 = num;
            }else if (num<min2){
                min2 = num;
            }
        }



        return Math.max(min1*min2*max1,max1*max2*max3);
    }


}
